package com.cdel.akka.AkkainJAVA.ask;

import static akka.pattern.Patterns.ask;
import static scala.compat.java8.FutureConverters.toJava;
import com.cdel.akka.util.FutureUtil;
import scala.concurrent.Future;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;

/**ask方法是Patterns类提供的.它最常用的方法签名是Future<Object> ask(ActorRef actor, Object message, Timeout timeout).
 * 也就是像某一个或某一组Actor发送一个消息,并设定一个超时时间,它返回一个Future对象.这样就可以像上面的例子那样的设定响应的事件处理了.
 * 但是需要注意的是,ask的被调用Actor必须在onReceive方法中显示的调用getSender().tell(xxxx,getSelf())发送Response为返回的Future填充数据.
 * @author DELL
 *
 */
public class DemoMain {
    public static void main(String[] args) throws Exception {
        final ActorSystem system = ActorSystem.create("helloakka");
        // 创建一个到greeter Actor的管道
        final ActorRef greeter = system.actorOf(Props.create(GreetPrinterActor.class), "greeter");
        // 先发第一个消息,消息类型为WhoToGreet
        Future sFuture = ask(greeter, new Greeting("akka"), 1000);
        System.out.println(FutureUtil.get(toJava(sFuture)));
    }
}